/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Session;

import Entity.ContratAuto;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import Entity.Client;
import java.math.BigInteger;

/**
 *
 * @author N
 */
@Stateless
public class ContratAutoSession implements ContratAutoSessionLocal {

    @javax.persistence.PersistenceContext(unitName = "Assurance-ejbPU")
    private EntityManager em;

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public boolean souscriptionAuto(String immatriculation, String modele, int categorie,
            int prix, boolean bris, boolean vol, boolean toutRisque, int franchise, String login) {
        if (immatriculation == null || modele == null || login == null) {
            return false;
        } else {
            Query q = em.createNamedQuery("Client.findByEmail");
            q.setParameter("email", login);
            Client c = (Client) q.getSingleResult();
            int numeroClient = c.getIdclient();
            ContratAuto ca = new ContratAuto(immatriculation, modele, categorie,
                    prix, bris, vol, toutRisque, franchise, numeroClient);
            em.persist(ca);
            return true;
        }
    }

    @Override
    public int[] calculDevis(String annee, String puissance, boolean collection, boolean moto,
            boolean bris, boolean vol, boolean toutRisque) {
        int categorie = cat(annee, puissance, collection, moto);
        int evaluation[] = new int[3];
        evaluation[0] = 0;
        evaluation[1] = 0;
        evaluation[2] = categorie;
        switch (categorie) {
            case 1:
                evaluation[0] += 260;
                if (bris) {
                    evaluation[0] += 40;
                }
                if (vol) {
                    evaluation[0] += 50;
                }
                if (toutRisque) {
                    evaluation[0] += 130;
                }
                evaluation[1] = 70;
                break;
            case 2:
                evaluation[0] += 360;
                if (bris) {
                    evaluation[0] += 50;
                }
                if (vol) {
                    evaluation[0] += 60;
                }
                if (toutRisque) {
                    evaluation[0] += 150;
                }
                evaluation[1] = 100;
                break;
            case 3:
                evaluation[0] += 460;
                if (bris) {
                    evaluation[0] += 60;
                }
                if (vol) {
                    evaluation[0] += 70;
                }
                if (toutRisque) {
                    evaluation[0] += 170;
                }
                evaluation[1] = 150;
                break;
            default:
                evaluation[0] = -1;
                evaluation[1] = -1;
                break;
        }
        return evaluation;

    }

    public static int cat(String annee, String puissance, boolean collection, boolean moto) {
        int categorie = 0;
        int compteur = 0;
        int coll = 0;
        int mot = 0;
        int an = Integer.parseInt(annee);
        int puiss = Integer.parseInt(puissance);

        //cas spéciaux moto et collection 
        if (collection) {
            compteur += 3;
        }
        if (moto) {
            compteur += 3;
        }

        //Catégorie sous forme de point, en fonction de l'année   
        if (an > 2005) {
            compteur += 3;
        } else if (an <= 2005 && an > 2000) {
            compteur += 2;
        } else if (an >= 1995 && an <= 2000) {
            compteur += 1;
        } else {
            compteur += 0;
        }
        // Puis en fonction de la puissance 
        if (puiss == 1) {
            compteur += 1;
        } else if (puiss == 2) {
            compteur += 2;
        } else {
            compteur += 3;
        }

        //définition de la catégorie; 
        if (compteur <= 3) {
            categorie = 1;
        } else if (compteur <= 6 && compteur > 3) {
            categorie = 2;
        } else {
            categorie = 3;
        }

        return categorie;
    }

    @Override
    public List<ContratAuto> recupContratAutoAValider() {

        List<ContratAuto> listContrat = new ArrayList<ContratAuto>();
        Query recup = em.createNamedQuery("ContratAuto.findByStatut");
        recup.setParameter("statut", "aValider");
        listContrat = recup.getResultList();
        return listContrat;

    }

    @Override
    public List<ContratAuto> recupContratAutoByNumClient(String numClient) {

        List<ContratAuto> listContrat = new ArrayList<ContratAuto>();
        Query recup = em.createNamedQuery("ContratAuto.findByNumeroClient");
        int num = Integer.parseInt(numClient);
        Integer numClientInteger = (Integer) num;
        BigInteger bi = BigInteger.valueOf(numClientInteger.intValue());
        System.out.println("j'ai convertit en bigInt");

        recup.setParameter("numeroClient", bi);

        listContrat = recup.getResultList();
        System.out.println("je suis recup list" + listContrat);

        return listContrat;

    }

    @Override
    public void traitementContratAutoRedac(String numRedacteur, String newEtat, String numContrat) {

        System.out.println("Param " + numRedacteur + " " + newEtat + " " + numContrat);
        Query find = em.createNamedQuery("ContratAuto.findByNumContratAuto");

        System.out.println("Avant le cast " + numContrat);
        int num = Integer.parseInt(numContrat);
        System.out.println("Le int casté " + num);

        Integer numerocontratInt = (Integer) num;

        System.out.println("Le integer casté " + numerocontratInt);

        find.setParameter("numContratAuto", numerocontratInt);
        System.out.println("test1");

        ContratAuto ca = (ContratAuto) find.getSingleResult();
        // TODO rajouter redacteur dans la BD de contratAuto
        //s.setNumredacteur(numRedacteur);
        ca.setStatut(newEtat);
        em.persist(ca);

    }

    @Override
    public boolean testExistance(String numeroContrat) {

        Query q = em.createNamedQuery("ContratAuto.findByNumContratAuto");
        Integer num = (Integer) Integer.parseInt(numeroContrat);
        q.setParameter("numContratAuto", num);
        ContratAuto c = (ContratAuto) q.getSingleResult();
        if (!c.equals(null)) {
            return true;
        }

        return false;

    }

    @Override
    public ContratAuto getContrat(String numcontrat) {
        Integer num = (Integer) Integer.parseInt(numcontrat);
        Query q = em.createNamedQuery("ContratAuto.findByNumContratAuto");
        q.setParameter("numContratAuto", num);
        ContratAuto c = (ContratAuto) q.getSingleResult();
        return c;
    }
    
    @Override
    public boolean supprimer(String numero){
        ContratAuto ca = getContrat(numero);
        System.out.println(ca.getImmatriculation());        
        em.remove(em.merge(ca));
        return true;
    }

}
